Micron Document
πŸŽ–οΈGitΠ―Ρ€Π°πŸŽ–οΈ


Displaying Raw β€’ Download

feature/firmware/src/commonTest/kotlin/org/meshtastic/feature/firmware/ota/BleScanSupportTest.kt 60b7908e1bfeb63eee3dcf6df655da4adb72e6c0 (60b7908e) Text, 3.64 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.feature.firmware.ota

Tff7b72import T7ee787kotlinx.coroutines.test.runTest
Tff7b72import T7ee787org.meshtastic.core.testing.FakeBleDevice
Tff7b72import T7ee787org.meshtastic.core.testing.FakeBleScanner
Tff7b72import T7ee787kotlin.test.Test
Tff7b72import T7ee787kotlin.test.assertEquals
Tff7b72import T7ee787kotlin.test.assertNotNull
Tff7b72import T7ee787kotlin.uuid.Uuid

Tff7b72class T56d364BleScanSupportTest Tb4b4b4{

T8b949e// ── calculateMacPlusOne ─────────────────────────────────────────────────

Tf0883e@Test
Tff7b72fun Td2a8ffcalculateMacPlusOneNormalTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3original Tff7b72= Ta5d6ff"Ta5d6ff12:34:56:78:9A:BCTa5d6ff"
T8b949e// 0xBC + 1 = 0xBD
Te6edf3assertEqualsTb4b4b4(Ta5d6ff"Ta5d6ff12:34:56:78:9A:BDTa5d6ff"Tb4b4b4, Te6edf3calculateMacPlusOneTb4b4b4(Te6edf3originalTb4b4b4)Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffcalculateMacPlusOneWrapAroundTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3original Tff7b72= Ta5d6ff"Ta5d6ff12:34:56:78:9A:FFTa5d6ff"
T8b949e// 0xFF + 1 = 0x100 -> truncated to modulo 0xFF is 0x00
Te6edf3assertEqualsTb4b4b4(Ta5d6ff"Ta5d6ff12:34:56:78:9A:00Ta5d6ff"Tb4b4b4, Te6edf3calculateMacPlusOneTb4b4b4(Te6edf3originalTb4b4b4)Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffcalculateMacPlusOneInvalidLengthTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3original Tff7b72= Ta5d6ff"Ta5d6ff12:34:56:78Ta5d6ff"
T8b949e// Return original if invalid
Te6edf3assertEqualsTb4b4b4(Te6edf3originalTb4b4b4, Te6edf3calculateMacPlusOneTb4b4b4(Te6edf3originalTb4b4b4)Tb4b4b4)
Tb4b4b4}

Tf0883e@Test
Tff7b72fun Td2a8ffcalculateMacPlusOneInvalidCharacterTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3original Tff7b72= Ta5d6ff"Ta5d6ff12:34:56:78:9A:ZZTa5d6ff"
T8b949e// Return original if cannot parse HEX
Te6edf3assertEqualsTb4b4b4(Te6edf3originalTb4b4b4, Te6edf3calculateMacPlusOneTb4b4b4(Te6edf3originalTb4b4b4)Tb4b4b4)
Tb4b4b4}

T8b949e// ── scanForBleDevice ────────────────────────────────────────────────────

Tff7b72private Tff7b72val Te6edf3testServiceUuid Tff7b72= Te6edf3UuidTb4b4b4.Te6edf3parseTb4b4b4(Ta5d6ff"Ta5d6ff00001801-0000-1000-8000-00805f9b34fbTa5d6ff"Tb4b4b4)

Tf0883e@Test
Tff7b72fun Td2a8ff`scanForBleDevice returns matching device`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3scanner Tff7b72= Te6edf3FakeBleScannerTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3target Tff7b72= Te6edf3FakeBleDeviceTb4b4b4(Te6edf3address Tff7b72= Ta5d6ff"Ta5d6ffAA:BB:CC:DD:EE:FFTa5d6ff"Tb4b4b4, Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffTargetTa5d6ff"Tb4b4b4)
Te6edf3scannerTb4b4b4.Te6edf3emitDeviceTb4b4b4(Te6edf3targetTb4b4b4)

Tff7b72val Te6edf3result Tff7b72=
Te6edf3scanForBleDeviceTb4b4b4(Te6edf3scanner Tff7b72= Te6edf3scannerTb4b4b4, Te6edf3tag Tff7b72= Ta5d6ff"Ta5d6fftestTa5d6ff"Tb4b4b4, Te6edf3serviceUuid Tff7b72= Te6edf3testServiceUuidTb4b4b4, Te6edf3retryCount Tff7b72= T79c0ff1Tb4b4b4) Tb4b4b4{
Tffa657itTb4b4b4.Te6edf3address Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ffAA:BB:CC:DD:EE:FFTa5d6ff"
Tb4b4b4}

Te6edf3assertNotNullTb4b4b4(Te6edf3resultTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Ta5d6ff"Ta5d6ffAA:BB:CC:DD:EE:FFTa5d6ff"Tb4b4b4, Te6edf3resultTb4b4b4.Te6edf3addressTb4b4b4)
Tb4b4b4}

T8b949e// Note: FakeBleScanner's flow never completes, so we cannot test the "no match" / retry-exhaustion path
T8b949e// without modifying the fake to respect the scan timeout. Positive match tests are sufficient for coverage.

Tf0883e@Test
Tff7b72fun Td2a8ff`scanForBleDevice ignores non-matching devices`Tb4b4b4(Tb4b4b4) Tff7b72= Te6edf3runTest Tb4b4b4{
Tff7b72val Te6edf3scanner Tff7b72= Te6edf3FakeBleScannerTb4b4b4(Tb4b4b4)
Te6edf3scannerTb4b4b4.Te6edf3emitDeviceTb4b4b4(Te6edf3FakeBleDeviceTb4b4b4(Te6edf3address Tff7b72= Ta5d6ff"Ta5d6ff11:22:33:44:55:66Ta5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3scannerTb4b4b4.Te6edf3emitDeviceTb4b4b4(Te6edf3FakeBleDeviceTb4b4b4(Te6edf3address Tff7b72= Ta5d6ff"Ta5d6ffAA:BB:CC:DD:EE:FFTa5d6ff"Tb4b4b4)Tb4b4b4)

Tff7b72val Te6edf3result Tff7b72=
Te6edf3scanForBleDeviceTb4b4b4(Te6edf3scanner Tff7b72= Te6edf3scannerTb4b4b4, Te6edf3tag Tff7b72= Ta5d6ff"Ta5d6fftestTa5d6ff"Tb4b4b4, Te6edf3serviceUuid Tff7b72= Te6edf3testServiceUuidTb4b4b4, Te6edf3retryCount Tff7b72= T79c0ff1Tb4b4b4) Tb4b4b4{
Tffa657itTb4b4b4.Te6edf3address Tff7b72=Tff7b72= Ta5d6ff"Ta5d6ffAA:BB:CC:DD:EE:FFTa5d6ff"
Tb4b4b4}

Te6edf3assertNotNullTb4b4b4(Te6edf3resultTb4b4b4)
Te6edf3assertEqualsTb4b4b4(Ta5d6ff"Ta5d6ffAA:BB:CC:DD:EE:FFTa5d6ff"Tb4b4b4, Te6edf3resultTb4b4b4.Te6edf3addressTb4b4b4)
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.09s